package com.yzs.service.Impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.yzs.common.bean.R;
import com.yzs.entity.Admin;
import com.yzs.entity.PageResult;
import com.yzs.entity.Personnel;
import com.yzs.mapper.AdminMapper;
import com.yzs.service.IPersonnelService;
import com.yzs.utils.MD5Util;
import com.yzs.utils.TimeUtil;
import org.apache.logging.log4j.util.Strings;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class PersonnelServiceImpl implements IPersonnelService {
    @Autowired
    AdminMapper mapper;

    @Override
    public R getPersonnel(String type) {
        if ("Admin".equals(type) || "Manager".equals(type)) {
            QueryWrapper<Admin> wrapper = new QueryWrapper<>();
            wrapper.eq("role", type);
            List<Admin> admins = mapper.selectList(wrapper);
            if (admins.isEmpty()) {
                return R.error("no data！");
            }
            admins.forEach((admin -> {
                admin.setPassword("");
            }));
            return R.ok(admins);
        }
        return R.error("no data！");
    }

    @Override
    public R addPersonnel(Personnel p) {
        // 校验密钥 => 用户名@密码 => role必须为 Admin 或者 SuperAdmin
        String secretKey = p.getSecretKey();
        Admin admin = checkSecretKey(secretKey);
        if (admin != null) {
            // 管理员密钥通过
            Admin a = new Admin(p);
            // 用户名 判断是否存在该用户
            QueryWrapper<Admin> wrapper = new QueryWrapper<>();
            wrapper.eq("username", a.getUsername());
            if (mapper.selectOne(wrapper) != null) {
                return R.error("该用户已存在！");
            }
            a.setCreateTime(TimeUtil.getNowTime());
            a.setRegisterUsername(admin.getUsername());
            a.setRegisterName(admin.getName());
            int i = mapper.insert(a);
            if (i == 1) {
                // 添加成功
                a.setPassword("");
                return R.ok("添加成功！", a);
            } else {
                return R.error("添加失败！");
            }
        }
        return R.error("密钥错误！");
    }

    @Override
    public R updatePersonnel(Personnel p) {
        // 校验密钥 => 用户名@密码 => role必须为 Admin 或者 SuperAdmin
        String secretKey = p.getSecretKey();
        Admin admin = checkSecretKey(secretKey);
        // 管理员密钥通过
        if (admin != null) {
            // 判断 是否为超级管理员 或者 创建该用户的管理员
            if (admin.getRole().equals("SuperAdmin") || admin.getRegisterUsername().equals(p.getRegisterUsername())) {
                Admin a = new Admin(p);
                int i = mapper.updateById(a);
                if (i == 1) {
                    // 修改成功
                    a.setPassword("");
                    return R.ok("修改成功！", a);
                } else {
                    return R.error("修改失败！");
                }
            }else {
                return R.error("你不是超级管理员或者创建该用户的管理员！请寻求有该权限的管理员！");
            }
        }
        return R.error("密钥错误！");
    }

    @Override
    public R deletePersonnel(Personnel p) {
        Admin admin = checkSecretKey(p.getSecretKey());
        // 管理员密钥通过
        if (admin != null) {
            // 判断 是否为超级管理员 或者 创建该用户的管理员
            if (admin.getRole().equals("SuperAdmin") || admin.getRegisterUsername().equals(p.getRegisterUsername())) {
                int i = mapper.deleteById(p.getId());
                if (i == 1) {
                    // 删除成功
                    return R.ok("删除成功！");
                } else {
                    return R.error("删除失败！");
                }
            }else {
                return R.error("你不是超级管理员或者创建该用户的管理员！请寻求有该权限的管理员！");
            }
        }
        return R.error("密钥错误！");
    }

    @Override
    public R getPersonnelByPage(String type, Integer currentPage, Integer pageSize) {
        if ("Admin".equals(type) || "Manager".equals(type)) {
            QueryWrapper<Admin> wrapper = new QueryWrapper<>();
            wrapper.eq("role", type);
            Page<Admin> page = new Page<>(currentPage, pageSize);
            page = mapper.selectPage(page, wrapper);

            if (page.getRecords().isEmpty()) {
                return R.error("no data！");
            }
            page.getRecords().forEach((admin -> {
                admin.setPassword("");
            }));
            PageResult<Admin> data = new PageResult<>(page.getTotal(),page.getRecords());

            return R.ok(data);
        }
        return R.error("no data！");
    }

    /**
     * 检验密钥
     *
     * @param key
     * @return
     */
    private Admin checkSecretKey(String key) {
        if (!Strings.isEmpty(key) && key.contains("@") && key.matches("\\S+\\@\\S+")) {
            String username, pwd;
            String[] split = key.split("@");
            username = split[0];
            pwd = MD5Util.GetMD5Code(split[1]);
            QueryWrapper<Admin> wrapper = new QueryWrapper<>();
            wrapper.eq("username", username).eq("password", pwd).eq("admin_status", "正常").in("role", "SuperAdmin", "Admin");
            return mapper.selectOne(wrapper);
        }
        return null;
    }
}
